#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <set>
#include <bitset>
#include <utility>
using namespace std;

#define mm(a, n) memset(a, n, sizeof a)
#define mk(a, b) make_pair(a, b)

const double eps = 1e-6;
const int INF = 0x3f3f3f3f;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef pair<LL, LL> PLL;
typedef pair<int, LL> PIL;

inline void quickread() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
}

const int N = 410;
// f[i][j][k]:所有只考虑前i个物品，且总p次方恰好是j，数的个数恰好是k的所有选法集合
int f[21][N][N];
int n, k, p;

int power(int a, int b) {
    int res = 1;
    for (int i = 0; i < b; i ++ ) res *= a;
    return res;
}

inline void solution() {
    cin >> n >> k >> p;
    mm(h, -INF);
    f[0][0][0] = 0;

    int m;
    for (m = 1; ; m ++ ) 
    {
        int v = power(m, p);
        if (v > n) break;
        
        for (int i = 0; i <= n; i ++ )
            for (int j = 0; j <= k; j ++ )
            {
                f[m][i][j] = f[m - 1][i][j];
                if (i >= v && j) f[m][i][j] = max(f[m][i][j], f[m][i - v][j - 1] + m);
            }
    }
    m -- ;

    if (f[m][n][k] < 0) printf("Impossible\n");
    else
    {
        printf("%d = ", n);
        bool is_first = true;
        while (m)
        {
            int v = power(m, p);
            while (n >= v && k && f[m][n - v][k - 1] + m == f[m][n][k])
            {
                if (is_first) is_first = false;
                else printf(" + ");

                printf("%d^%d", m, p);
                n -= v, k -- ;
            }
            m -- ;
        }
    }
}

int main() {
    freopen("input.txt", "r", stdin);
    quickread();
    solution();
    return 0;
}